package com.ronz.stack;


import java.util.Scanner;

/**
 * @Description 栈的基本演示
 * @Author Ronz
 * @Date 2020/12/27 16:47
 * @Version 1.0
 */
public class No1_StackBasicDemo {
    public static void main(String[] args) {
        ArrayStack stack = new ArrayStack(10);
        Scanner input = new Scanner(System.in);

        boolean flag =  true;
        while (flag){
            System.out.println("-------M E N U -------");
            System.out.println("请选择您的操作：");
            System.out.println("push:\t数据入栈");
            System.out.println("pop:\t数据出栈");
            System.out.println("show:\t打印栈数据");
            System.out.println("exit:\t退出程序");
            System.out.println("-------M E N U -------");
            String select = input.nextLine();
            switch (select){
                case "push":
                    System.out.println("请输入要入栈的元素：");
                    int num = Integer.parseInt(input.nextLine());
                    stack.push(num);
                    // 就是为了让程序停一下
                    System.out.print("按下任意键继续：");
                    input.nextLine();
                    break;
                case "pop":
                    try{
                        int pop = stack.pop();
                        System.out.println("出栈的元素为：" + pop);
                    } catch (RuntimeException e){
                        System.out.println(e.getMessage());
                    }
                    // 就是为了让程序停一下
                    System.out.print("按下任意键继续：");
                    input.nextLine();
                    break;
                case "show":
                    stack.showStack();
                    // 程序停一下
                    System.out.print("按下任意键继续：");
                    input.nextLine();
                    break;
                case "exit":
                    flag = false;
                    break;
                    default:
                        break;
            }
        }

    }
}

/**
 * @Description 使用数组演示栈的功能
 */
class ArrayStack{
    private int maxSize;    // 栈的大小
    private int[] array;    // 此数组用于模拟栈
    private int pos;        // 栈的指针

    public ArrayStack(int maxSize){
        this.maxSize = maxSize;
        array = new int[maxSize];
        pos = -1;   // 指针初始指向第 -1 个位置
    }

    // 判断栈是否满了
    public boolean isFull(){
        return pos == maxSize - 1;
    }

    // 判断栈是否为空
    public boolean isEmpty(){
        return pos == -1;
    }

    // 打印栈中数据
    public void showStack(){
        if (isEmpty()){
            System.out.println("栈为空！");
            return;
        }
        System.out.println("============================");
        System.out.println("栈中内容如下：");
        System.out.println("---------");
        for (int i=pos; i>=0; i--){
            System.out.println("|\t" + array[i] + "\t|") ;
            System.out.println("---------");
        }
    }

    // 模拟入栈
    public void push(int num){
        // 1. 首先判断栈是否满了
        if (isFull()){
            System.out.println("栈满了，无法入栈！");
            return;
        }
        // 2. 先把指针加 1，然后入栈
        array[++pos] = num;
        System.out.println(num + " 入栈成功！");
    }

    // 模拟出栈
    public int pop(){
        // 1. 首先判断是否为空
        if (isEmpty()){
            throw new RuntimeException("栈空了，无法出栈！");
        }
        // 2. 先让数据出栈，然后指针减 1
        return array[pos--];
    }
}
